﻿using System;
using System.Data;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using UniMana.Data;
using UniMana.Utils.Data;
using UniMana.Utils.Helper;
using UniMana.Utils.Configs;


namespace UniMana.Win.Training.xucUserControl
{
    public partial class xucMonthCalendar_Day : UserControl
    {
        public DateTime m_dDatetimeConst;
        public DateTime m_dDatetime;
        public DateTime m_dDatetimeStart;
        public DateTime m_dDatetimeEnd;        
        private DBMain m_data = new DBMain();
        public DataTable m_tblTable;
        public bool m_bSaveActive = false;
        public bool m_bSaveGroup = false;
        Personnel_PersonnelInfo personInfo;
        private Personnel_Personnel_SessionInfo personsessionInfo;
        private int m_iDayOfWeek = 0;
        public DevExpress.Utils.WaitDialogForm dlg;
        
        /// <summary>
        /// Khởi tạo chung
        /// </summary>
        
        public xucMonthCalendar_Day()
        {
            InitializeComponent();
            // Khởi tạo giảng viên
            personInfo = new Personnel_PersonnelInfo(xucUserControlStatic.m_strPersonKey);            
        }

        /// <summary>
        /// Xác định DayOfWeek
        /// </summary>

        private void GetDayOfWeek()
        {
            m_iDayOfWeek = ClsReturnDayOfWeek.convertToInt(m_dDatetime);
        }

        /// <summary>
        /// Hiển thị các giá trị tên thời gian ngày tháng
        /// </summary>

        public void DisplayValueStaticTime()
        {
            try
            {
                lbcDateTime.Text = m_dDatetime.Date.ToShortDateString();
                lbcCa1.Text = xucUserControlStatic.Ca1Name;
                lbcCa2.Text = xucUserControlStatic.Ca2Name;
                lbcCa3.Text = xucUserControlStatic.Ca3Name;
                lbcCa1Time.Text = xucUserControlStatic.Ca1Time;
                lbcCa2Time.Text = xucUserControlStatic.Ca2Time;
                lbcCa3Time.Text = xucUserControlStatic.Ca3Time;
            }
            catch { }
        }

        /// <summary>
        /// Hàm lấy dữ liệu ban đầu
        /// </summary>

        private void LoadData()
        {
            try
            {
                m_tblTable = (this.m_data.m_DCReadOnly.Personnel_WorkTypes.GetDataKeyName()).ToDataTable();
                luePersonnel_WorkType1.GetData(m_tblTable, "Personnel_WorkTypeKey", "Name");
                luePersonnel_WorkType2.GetData(m_tblTable, "Personnel_WorkTypeKey", "Name");
                luePersonnel_WorkType3.GetData(m_tblTable, "Personnel_WorkTypeKey", "Name");
                LoadDataInDay();
            }
            catch { }
        }

        /// <summary>
        /// Hàm lấy dữ liệu đăng ký trong ngày
        /// </summary>

        private void LoadDataInDay()
        {
            try
            {
                ResetData();
                m_tblTable = (this.m_data.m_DCReadOnly.Personnel_Personnel_Sessions.GetAllData(personInfo.Properties.Personnel_PersonnelKey.ToString(), m_dDatetime)).ToDataTable();
                if (m_tblTable.Rows.Count != 0)
                {
                    for (int i = 0; i < m_tblTable.Rows.Count; i++)
                    {
                        if (int.Parse(m_tblTable.Rows[i]["Training_SessionKey"].ToString()) == xucUserControlStatic.Ca1Key)
                        {
                            luePersonnel_WorkType1.EditValue = int.Parse(m_tblTable.Rows[i]["Personnel_WorkTypeKey"].ToString());
                            rtbContent1.Text = m_tblTable.Rows[i]["Note"].ToString();
                        }
                        if (int.Parse(m_tblTable.Rows[i]["Training_SessionKey"].ToString()) == xucUserControlStatic.Ca2Key)
                        {
                            luePersonnel_WorkType2.EditValue = int.Parse(m_tblTable.Rows[i]["Personnel_WorkTypeKey"].ToString());
                            rtbContent2.Text = m_tblTable.Rows[i]["Note"].ToString();
                        }
                        if (int.Parse(m_tblTable.Rows[i]["Training_SessionKey"].ToString()) == xucUserControlStatic.Ca3Key)
                        {
                            luePersonnel_WorkType3.EditValue = int.Parse(m_tblTable.Rows[i]["Personnel_WorkTypeKey"].ToString());
                            rtbContent3.Text = m_tblTable.Rows[i]["Note"].ToString();
                        }
                    }
                }
                GetDayOfWeek();
            }
            catch { }
        }

        /// <summary>
        /// Khởi tạo lại các giá trị các buổi và công việc
        /// </summary>

        private void ResetData()
        {
            try
            {
                luePersonnel_WorkType1.EditValue = null;
                luePersonnel_WorkType2.EditValue = null;
                luePersonnel_WorkType3.EditValue = null;
                rtbContent1.Text = "";
                rtbContent2.Text = "";
                rtbContent3.Text = "";
            }
            catch { }
        }
        
        /// <summary>
        /// Form load
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

        private void xucMonthCalendar_Day_Load(object sender, EventArgs e)
        {
            try
            {
                LoadData();
                DisplayValueStaticTime();
                // Kích hoạt hàm tự động save dữ liệu khi form chính click save
                AutoSave.Enabled = true;
            }
            catch { }
        }

        /// <summary>
        /// Quay về ngày trước đó
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

        private void lbcPrevious_Click(object sender, EventArgs e)
        {
            try
            {
                this.m_dDatetime = (this.m_dDatetime - new TimeSpan(1, 0, 0, 0));
                this.lbcDateTime.Text = this.m_dDatetime.Date.ToShortDateString();
                LoadDataInDay();
            }
            catch { }
        }

        /// <summary>
        /// Đi đến ngày kế tiếp
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

        private void lbcNext_Click(object sender, EventArgs e)
        {
            try
            {
                this.m_dDatetime = (this.m_dDatetime + new TimeSpan(1, 0, 0, 0));

                this.lbcDateTime.Text = this.m_dDatetime.Date.ToShortDateString();
                LoadDataInDay();
            }
            catch { }
        }

        /// <summary>
        /// Tắt giao diện đăng ký công việc
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

        private void lbcDateTime_Click(object sender, EventArgs e)
        {
            try
            {
                // Kích hoạt biến điều khiển tự động tô màu các ngày có công việc
                xucUserControlStatic.m_bAutoMark = true;
                // Kích hoạt biến điều khiển cho chọn giảng viên
                xucUserControlStatic.m_bSelectPersonConTrol = true;
                // Tắt giao diện đăng ký công việc
                this.Dispose();
            }
            catch { }
        }                     

        /// <summary>
        /// Hàm xóa công việc hiển thị ở vị trị buổi chọn
        /// </summary>
        /// <param name="m_iPosition"></param>

        private void ClearDataAt(int m_iPosition)
        {
            try
            {
                if (m_iPosition == 1)
                {
                    luePersonnel_WorkType1.EditValue = null;
                    rtbContent1.Text = "";
                }
                if (m_iPosition == 2)
                {
                    luePersonnel_WorkType2.EditValue = null;
                    rtbContent2.Text = "";
                }
                if (m_iPosition == 3)
                {
                    luePersonnel_WorkType3.EditValue = null;
                    rtbContent3.Text = "";
                }
            }
            catch { }
        }

        /// <summary>
        /// Hàm xóa dữ liệu công việc ở vị trị buổi chọn
        /// </summary>
        /// <param name="m_iPosition"></param>

        private void DeleteDataAt(int m_iPosition)
        {
            try
            {
                ClearDataAt(m_iPosition);
                personsessionInfo = new Personnel_Personnel_SessionInfo(m_iPosition, xucUserControlStatic.m_strPersonKey, m_dDatetime, m_iDayOfWeek);
                if (personsessionInfo.Properties.Training_SessionKey > 0)
                {
                    personsessionInfo.Delete();
                    XtraMessageBox.Show("Đã xóa");
                }
            }
            catch { }
        }

        /// <summary>
        /// Xóa công việc buổi thứ 1
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

        private void lbcClear1_Click(object sender, EventArgs e)
        {
            try
            {
                if (ControlUtils.ConvertValueToInt(luePersonnel_WorkType1.EditValue) > 0)
                {
                    DialogResult result = MessageBox.Show("Bạn muốn xóa công việc vào buổi Ca 1", "Thông báo", MessageBoxButtons.YesNo);
                    if (result == DialogResult.Yes)
                    {
                        DeleteDataAt(xucUserControlStatic.Ca1Key);
                    }
                }
            }
            catch { }
        }

        /// <summary>
        /// Xóa công việc buổi thứ 2
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

        private void lbcClear2_Click(object sender, EventArgs e)
        {
            try
            {
                if (ControlUtils.ConvertValueToInt(luePersonnel_WorkType2.EditValue) > 0)
                {
                    DialogResult result = MessageBox.Show("Bạn muốn xóa công việc vào buổi Ca 2", "Thông báo", MessageBoxButtons.YesNo);
                    if (result == DialogResult.Yes)
                    {
                        DeleteDataAt(xucUserControlStatic.Ca2Key);
                    }
                }
            }
            catch { }
        }

        /// <summary>
        /// Xóa công việc buổi thứ 3
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

        private void lbcClear3_Click(object sender, EventArgs e)
        {
            try
            {
                if (ControlUtils.ConvertValueToInt(luePersonnel_WorkType3.EditValue) > 0)
                {
                    DialogResult result = MessageBox.Show("Bạn muốn xóa công việc vào buổi Ca 3", "Thông báo", MessageBoxButtons.YesNo);
                    if (result == DialogResult.Yes)
                    {
                        DeleteDataAt(xucUserControlStatic.Ca3Key);
                    }
                }
            }
            catch { }
        }


        // ********************************** Lưu thông tin ********************************** //

        /// <summary>
        /// Hàm lưu ở vị trí buổi thứ i
        /// </summary>
        /// <param name="m_iPosition"></param>

        private void SaveAt(int m_iPosition)
        {
            try
            {

                personsessionInfo = new Personnel_Personnel_SessionInfo(m_iPosition, personInfo.Properties.Personnel_PersonnelKey.ToString(), m_dDatetime, m_iDayOfWeek);
                if (personsessionInfo.Properties.Training_SessionKey > 0)
                {
                    // Co du lieu
                }
                else
                {
                    personsessionInfo.Properties.Training_SessionKey = m_iPosition;
                    personsessionInfo.Properties.Personnel_PersonnelKey = Guid.Parse(personInfo.Properties.Personnel_PersonnelKey.ToString());
                    personsessionInfo.Properties.RegistTime = m_dDatetime;
                    personsessionInfo.Properties.Training_WeekDayKey = m_iDayOfWeek;
                    personsessionInfo.Properties.Status = false;
                    if (m_iPosition == xucUserControlStatic.Ca1Key)
                    {
                        personsessionInfo.Properties.Personnel_WorkTypeKey = ControlUtils.ConvertValueToInt(luePersonnel_WorkType1.EditValue);
                        personsessionInfo.Properties.Note = rtbContent1.Text;
                    }
                    if (m_iPosition == xucUserControlStatic.Ca2Key)
                    {
                        personsessionInfo.Properties.Personnel_WorkTypeKey = ControlUtils.ConvertValueToInt(luePersonnel_WorkType2.EditValue);
                        personsessionInfo.Properties.Note = rtbContent2.Text;
                    }
                    if (m_iPosition == xucUserControlStatic.Ca3Key)
                    {
                        personsessionInfo.Properties.Personnel_WorkTypeKey = ControlUtils.ConvertValueToInt(luePersonnel_WorkType3.EditValue);
                        personsessionInfo.Properties.Note = rtbContent3.Text;
                    }
                    personsessionInfo.Save();
                }
            }
            catch { }
        }

        /// <summary>
        /// Hàm kiểm tra lưu thông tin tại 1 thời điểm hay trong 1 khoảng thời gian
        /// </summary>
        /// <param name="m_iPosition"></param>

        private void SaveData(int m_iPosition)
        {
            try
            {
                SaveAt(m_iPosition);
                // Nếu kích hoạt tính năng lưu dữ liệu trên 1 khoảng thời gian
                if (m_bSaveGroup)
                {
                    DateTime datetime = new DateTime();
                    datetime = m_dDatetime;
                    // nếu điểm thời gian đăng ký nằm sau hoặc trùng thời gian kết thúc khoảng thời gian cần đăng ký
                    if (m_dDatetime >= m_dDatetimeEnd)
                    {
                        // giảm điểm thời gian xuống n tuần đến khi điểm thời gian nằm trong khoảng thời gian
                        while (m_dDatetime > m_dDatetimeEnd)
                        {
                            m_dDatetime = m_dDatetime - new TimeSpan(7, 0, 0, 0);
                        }
                        // lưu dữ liệu các ngày trong khoảng thời gian, thời gian giảm xuống 1 tuần sau mỗi lần lưu
                        while (m_dDatetime >= m_dDatetimeStart)
                        {
                            SaveAt(m_iPosition);
                            m_dDatetime = m_dDatetime - new TimeSpan(7, 0, 0, 0);
                        }
                    }
                    // nếu điểm thời gian đăng ký nằm trước hoặc trùng thời gian bắt đầu khoảng thời gian cần đăng ký
                    if (m_dDatetime <= m_dDatetimeStart)
                    {
                        // tăng điểm thời gian xuống n tuần đến khi điểm thời gian nằm trong khoảng thời gian
                        while (m_dDatetime < m_dDatetimeStart)
                        {
                            m_dDatetime = m_dDatetime + new TimeSpan(7, 0, 0, 0);
                        }
                        // lưu dữ liệu các ngày trong khoảng thời gian, thời gian tăng lên 1 tuần sau mỗi lần lưu
                        while (m_dDatetime <= m_dDatetimeEnd)
                        {
                            SaveAt(m_iPosition);
                            m_dDatetime = m_dDatetime + new TimeSpan(7, 0, 0, 0);
                        }
                    }
                    // nếu điểm thời gian đăng ký nằm trong khoảng thời gian cần đăng ký
                    if ((m_dDatetime > m_dDatetimeStart) && (m_dDatetime <= m_dDatetimeEnd))
                    {
                        DateTime _d = this.m_dDatetime;
                        // lưu dữ liệu từ điểm thời gian đăng ký sau mỗi lần tăng thời gian thêm 1 tuần
                        while (m_dDatetime < m_dDatetimeEnd)
                        {
                            SaveAt(m_iPosition);
                            m_dDatetime = m_dDatetime + new TimeSpan(7, 0, 0, 0);
                        }
                        m_dDatetime = _d - new TimeSpan(7, 0, 0, 0); ;
                        // lưu dữ liệu từ điểm thời gian đăng ký sau mỗi lần giảm thời gian thêm 1 tuần
                        while (m_dDatetime > m_dDatetimeStart)
                        {
                            SaveAt(m_iPosition);
                            m_dDatetime = m_dDatetime - new TimeSpan(7, 0, 0, 0);
                        }
                    }
                    m_dDatetime = datetime;
                }
            }
            catch { }
        }

        /// <summary>
        /// Hàm gọi save thông tin khi có dữ liẹu
        /// </summary>

        private void SaveInformation()
        {
            try
            {
                dlg = new DevExpress.Utils.WaitDialogForm(MsgConfig.MSG_WAIT, MsgConfig.MSG_LOADING);                                
                int _d = 0;
                if (ControlUtils.ConvertValueToInt(luePersonnel_WorkType1.EditValue) > 0)
                {
                    _d = 1;
                    m_dDatetime = m_dDatetimeConst;
                    SaveData(xucUserControlStatic.Ca1Key);
                }
                if (ControlUtils.ConvertValueToInt(luePersonnel_WorkType2.EditValue) > 0)
                {
                    _d = 1;
                    m_dDatetime = m_dDatetimeConst;
                    SaveData(xucUserControlStatic.Ca2Key);
                }
                if (ControlUtils.ConvertValueToInt(luePersonnel_WorkType3.EditValue) > 0)
                {
                    _d = 1;
                    m_dDatetime = m_dDatetimeConst;
                    SaveData(xucUserControlStatic.Ca3Key);
                }
                dlg.Close();
                if (_d == 1)
                {
                    XtraMessageBox.Show("Đã lưu thông tin đăng ký");
                }
                if (_d == 0)
                {
                    XtraMessageBox.Show("Không có thông tin để lưu");
                }
            }
            catch { }
        }

        /// <summary>
        /// Hàm tự động save thông tin khi form chính chọn save
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

        private void AutoSave_Tick(object sender, EventArgs e)
        {
            try
            {
                // Nếu biến điều khiển save thông tin được kích hoạt từ form chính
                if (m_bSaveActive)
                {
                    AutoSave.Enabled = false;
                    // Save thông tin
                    SaveInformation();
                    m_bSaveActive = false;
                    AutoSave.Enabled = true;
                }
            }
            catch { }
        }

        // ********************************** Kết thúc lưu thông tin ********************************** //
        



        // ***************************** Sự kiện trỏ chuột vào chọn ***************************** //

        private void lbcDateTime_MouseHover(object sender, EventArgs e)
        {
            this.lbcDateTime.Appearance.Font = new System.Drawing.Font("Tahoma", 8.25F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Underline))));
        }

        private void lbcDateTime_MouseLeave(object sender, EventArgs e)
        {
            this.lbcDateTime.Appearance.Font = new System.Drawing.Font("Tahoma", 8.25F);
        }

        private void lbcPrevious_MouseHover(object sender, EventArgs e)
        {
            this.lbcPrevious.Appearance.Font = new System.Drawing.Font("Tahoma", 8.25F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Underline))));
        }

        private void lbcPrevious_MouseLeave(object sender, EventArgs e)
        {
            this.lbcPrevious.Appearance.Font = new System.Drawing.Font("Tahoma", 8.25F);
        }

        private void lbcNext_MouseHover(object sender, EventArgs e)
        {
            this.lbcNext.Appearance.Font = new System.Drawing.Font("Tahoma", 8.25F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Underline))));
        }

        private void lbcNext_MouseLeave(object sender, EventArgs e)
        {
            this.lbcNext.Appearance.Font = new System.Drawing.Font("Tahoma", 8.25F);
        }

        private void lbcClear1_MouseHover(object sender, EventArgs e)
        {
            this.lbcClear1.Appearance.Font = new System.Drawing.Font("Tahoma", 8.25F, ((System.Drawing.FontStyle)(((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic)
                            | System.Drawing.FontStyle.Underline))));
        }

        private void lbcClear1_MouseLeave(object sender, EventArgs e)
        {
            this.lbcClear1.Appearance.Font = new System.Drawing.Font("Tahoma", 8.25F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Italic | System.Drawing.FontStyle.Underline))));
        }

        private void lbcClear2_MouseHover(object sender, EventArgs e)
        {
            this.lbcClear2.Appearance.Font = new System.Drawing.Font("Tahoma", 8.25F, ((System.Drawing.FontStyle)(((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic)
                            | System.Drawing.FontStyle.Underline))));
        }

        private void lbcClear2_MouseLeave(object sender, EventArgs e)
        {
            this.lbcClear2.Appearance.Font = new System.Drawing.Font("Tahoma", 8.25F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Italic | System.Drawing.FontStyle.Underline))));
        }

        private void lbcClear3_MouseHover(object sender, EventArgs e)
        {
            this.lbcClear3.Appearance.Font = new System.Drawing.Font("Tahoma", 8.25F, ((System.Drawing.FontStyle)(((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic)
                            | System.Drawing.FontStyle.Underline))));
        }

        private void lbcClear3_MouseLeave(object sender, EventArgs e)
        {
            this.lbcClear3.Appearance.Font = new System.Drawing.Font("Tahoma", 8.25F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Italic | System.Drawing.FontStyle.Underline))));
        }

        // ***************************** Kết thúc sự kiện trỏ chuột vào chọn ***************************** //
    }
}
